package com.yzh.springboot_rbac.controller;

import com.yzh.springboot_rbac.entity.Dept;
import com.yzh.springboot_rbac.service.DeptService;
import com.yzh.springboot_rbac.utils.AjaxResult;
import com.yzh.springboot_rbac.utils.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * 部门管理功能模块
 */
@RestController
@RequestMapping("/dept")
public class DeptController extends BaseController {
    /*此控制器对用户点击用户管理按钮的时候响应数据*/

    @Autowired
    private DeptService deptService;
    /*1.首次点击部门管理，跳转到这个方法，右边展示所有部门信息*/

    /**
     * 1.查询所有部门信息，树形结构展示
     */
    @PostMapping("/selectAllDept")
    public Dept selectALLDept() throws IllegalAccessException {
        Dept deptAll = deptService.selectAllDept();
        return deptAll;
    }

    /**
     * 2.新增部门
     */
    /*点击新增按钮，添加部门信息
     *   要求：1.上机部门，部门名称，显示排序不准为空。负责人，联系电话，邮箱可以为空，部门状态必须选一个
     *        2.每次新增前要判断部门是否存在，存在就往回返，不存在就插入*/
    @PostMapping("/addDept")
    public AjaxResult addDept(@Valid @RequestBody Dept dept) {
        boolean flag = deptService.isDept(dept);
        /*第一种处理返回结果的方法
         *   - 为真调用basecontroller的静态success方法
         *   - 为假调用AjaxResult的error的自定义错误信息的方法*/
//        if (flag) {
//            return success(dept);
//        } else {
//            return error("该用户已经存在");
//        }

        /*第二种处理结果的方法，
         *   - 使用BaseController的toAjax的方法，但是需要继承一下BaseController这个类
         *       1.可以new一个对象
         *       2.直接this.toAjax()因为springioc容器已经帮你创建了对象
         *       3.直接toAjax()隐式调用，编译器会自动解析为this.toAjax()*/
//        DeptController deptController = new DeptController();
//        return deptController.toAjax(flag);
        return toAjax(flag);
    }

    /**
     * 3.删除部门信息
     */
       /*注意：
        - 1.删除部门后，用户表中的depid是不是要删除？
        - 2.删除部门要根据部门名字和部门的parentId
        - 3.不加@Request注解，则无法从前端的json数据中解析
            默认从表单中解析，一旦加上，我直接从前端获取的就是json数据格式*/
    @PostMapping("/deleteDept")
    public AjaxResult deleteDept(@RequestBody Dept dept) {
        boolean flag = deptService.isDeletDept(dept);
        return toAjax(flag);
    }

    /**
     * 4.查询部门信息
     */
    /*条件：
     *   1.根据部门名字和部门状态查询
     *   2.有6种情况：通过if即可完成这六种情况
     *       （1）名字空，状态1 查找所有开启部门
     *       （2）名字空，状态空 查找所有部门
     *       （3）名字空，状态0  查找所有关闭部门
     *       （4）名字有，状态1 查找对应名字的所有开启部门
     *       （5）名字有，状态空 查找对应名字的所有部门
     *       （6）名字有，状态0 查找对应名字的关闭部门*/
    @PostMapping("/selectDept")
    public AjaxResult selectDept(@RequestParam("deptName") String deptName, @RequestParam("status") String status) {
        System.out.println("deptName: " + deptName); // 打印 deptName
        System.out.println("status: " + status);
        return success(deptService.selectDept(deptName, status));
    }

    /**
     * 5.修改部门信息
     *
     * @param dept
     * @return
     */
    /*5.修改部门信息*/
    @PostMapping("/updateDept")
    public AjaxResult updateDept(@Valid @RequestBody Dept dept) {
        Boolean flag = deptService.isUpdateDept(dept);
        if (flag) {
            return success(dept);
        } else {
            return error();
        }
    }

    /**
     * 6.保存部门
     */
    /*这个路径是整合修改和新增接口,目前我感觉没有用，因为我新增和修改都有具体路径*/
    @PostMapping("/saveDept")
    public AjaxResult saveDept(@Valid @RequestBody Dept dept) {
        if (dept.getDeptId() == null) {
            return toAjax(deptService.isDept(dept));
        } else {
            return toAjax(deptService.isUpdateDept(dept));
        }
    }
}
